home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / OVRLAYIN.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-20  |  6KB  |  218 lines

  1. UNIT OvrlayIn;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Initializing of overlay manager               Last changed: 20.04.96  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-95 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. IMPLEMENTATION
  16.  
  17. USES {$IFDEF Alpha} OpCrt, {$ENDIF} Overlay, Dos, OpXms, OpString, OvrLay;
  18.  
  19. TYPE
  20.   OvrSteu = RECORD
  21.     Int3f     : Integer;
  22.     Unterbr   : Integer;
  23.     CodePtr   : LongInt;
  24.     CodeLen   : Word;
  25.     RelocLen  : Word;
  26.     JmpCnt    : Integer;
  27.     NextCode  : Word;
  28.     LoadAdr   : Word;
  29.     StackPos  : Word;
  30.     NextLoad  : Word;
  31.     EmsNr     : Integer;
  32.     EmsOffs   : Word;
  33.     free1     : Integer;
  34.     XMSOffset : LongInt;          { Offset of unit into XMS Memory }
  35.     Vector    : array[0..1] of array[1..4] of byte;
  36.   END;
  37.  
  38. VAR
  39.   XMSHandle    : Word;
  40.   OldReadBuf   : OvrReadFunc;
  41.   OrgExit      : Pointer;
  42.   CurXMSOffset : LongInt;
  43.  
  44.  
  45.   PROCEDURE OvrXMSExit;
  46.   BEGIN
  47.     ExitProc:=OrgExit;
  48.     OvrReadBuf:=OldReadBuf;
  49.     IF XMSHandle<>0 THEN FreeExtMem(XMSHandle);
  50.   END;
  51.  
  52.   FUNCTION GetReqOvlSize: LongInt;
  53.   VAR
  54.     w       : Word;
  55.     OSize   : LongInt;
  56.     SteuPtr : ^OvrSteu;
  57.   BEGIN
  58.     OSize:=0;
  59.     w:=OvrCodeList;
  60.     WHILE w<>0 DO
  61.     BEGIN
  62.       SteuPtr:=Ptr(w+PreFixSeg+$10,0);
  63.       Inc(OSize,SteuPtr^.CodeLen+1);
  64.       w:=SteuPtr^.NextCode;
  65.     END;
  66.     GetReqOvlSize:=OSize;
  67.   END;
  68.  
  69. {$IFDEF Alpha}
  70.   FUNCTION OwnOvrReadBuf(OvrSeg: Word): Integer; far;
  71.   BEGIN
  72.     OwnOvrReadBuf:=OldReadBuf(OvrSeg);
  73.     FastWrite(Long2Str(OvrLoadCount), 1, 1, $70);
  74.   END;
  75. {$ENDIF}
  76.  
  77.   FUNCTION OwnOvrReadFromXMS(OvrSeg: Word): Integer; far;
  78.   VAR
  79.     ps,pd   : ExtMemPtr;
  80.     Result  : Integer;
  81.     SteuPtr : ^OvrSteu;
  82.   BEGIN
  83.     SteuPtr:=Ptr(OvrSeg,0);
  84.     IF SteuPtr^.EMSNr=0 THEN               { Still not loaded from file }
  85.     BEGIN
  86.       Result:=OldReadBuf(OvrSeg);
  87.       IF Result=0 THEN
  88.       BEGIN
  89.         SteuPtr^.XMSOffset:=CurXMSOffset;
  90.         SteuPtr^.EMSNr:=1;                  { Mark as loaded in XMS }
  91.         ps.RealPtr:=Ptr(SteuPtr^.LoadAdr,0);
  92.         pd.ProtectedPtr:=CurXMSOffset;
  93.         IF Odd(SteuPtr^.CodeLen) THEN Inc(SteuPtr^.CodeLen);
  94.         IF MoveExtMemBlock(SteuPtr^.CodeLen, 0, ps, XMSHandle, pd)<>0 THEN
  95.         BEGIN
  96.           Result:=-4
  97.         END ELSE
  98.           Inc(CurXMSOffset,SteuPtr^.CodeLen);
  99.       END;
  100.     END ELSE
  101.     BEGIN
  102.       pd.RealPtr:=Ptr(SteuPtr^.LoadAdr,0);
  103.       ps.ProtectedPtr:=SteuPtr^.XMSOffset;
  104.       Result:=MoveExtMemBlock(SteuPtr^.CodeLen, XMSHandle, ps, 0, pd);
  105.     END;
  106.     OwnOvrReadFromXMS:=Result;
  107.   END;
  108.  
  109.   PROCEDURE OvrInitXMS;
  110.   VAR
  111.     OSize : LongInt;
  112.     TotalFree,LargestBlock: Word;
  113.   BEGIN
  114.     OvrResult:=0;
  115.     OSize:=(GetReqOvlSize+$3FF) SHR 10;
  116.     IF NOT (XMSInstalled AND (QueryFreeExtMem(TotalFree, LargestBlock)=0) AND
  117.        (LargestBlock>=OSize) AND (AllocateExtMem(OSize, XMSHandle)=0)) THEN
  118.     BEGIN
  119.       OvrResult:=-6;
  120.     END ELSE
  121.     BEGIN
  122.       CurXMSOffset:=0;
  123.       OldReadBuf:=OvrReadBuf;
  124.       OrgExit:=ExitProc;
  125.       ExitProc:=@OvrXMSExit;
  126.       OvrReadBuf:=OwnOvrReadFromXMS;
  127.     END;
  128.   END;
  129.  
  130.   PROCEDURE InitOverlay;
  131.   VAR
  132.     i          : Byte;
  133.     ii         : Integer;
  134.     OvrUseEMS  : Boolean;
  135.     OvrXtraBuf : LongInt;
  136.  
  137.     PROCEDURE ParseCmdLine;
  138.     VAR
  139.       i: Byte;
  140.       Tmp, Param : String;
  141.       x  : LongInt;
  142.       Ok : Integer;
  143.     BEGIN
  144.       Tmp:=StUpCase(GetEnv('POPCMDLINE'));
  145.       FOR i:=1 TO ParamCount DO
  146.         Tmp:=Tmp+' '+StUpCase(ParamStr(i));
  147.       FOR i:=1 TO WordCount(Tmp, [' ']) DO
  148.       BEGIN
  149.         Param:=ExtractWord(i, Tmp, [' ']);
  150.  
  151.         IF Param[1] IN ['-','/'] THEN
  152.         BEGIN
  153.           Delete(Param,1,1);
  154.           CASE Param[1] OF
  155.             'B' : BEGIN
  156.                     Val(Copy(Param,2,Length(Param)-1),x,ok);
  157.                     IF ok=0 THEN OvrXtraBuf:=x;
  158.                   END;
  159.             '?',
  160.             'E' : OvrUseEMS:=False;
  161.           END;
  162.         END;
  163.       END;
  164.     END;
  165.  
  166.   BEGIN
  167.     OvrUseEMS:=True;
  168.     OvrXtraBuf:=65536;
  169.     ParseCmdLine;
  170.  
  171.     OvrFileMode:=$20;
  172.     OvrInit(Copy(ParamStr(0),1,Length(ParamStr(0))-3)+'OVR');
  173.     IF OvrResult<>ovrOk THEN
  174.     BEGIN
  175.       OvrInit(ParamStr(0));
  176.       IF OvrResult<>ovrOk THEN
  177.       BEGIN
  178.         WriteLn('Error initializing overlaymanager.');
  179.         Halt(252);
  180.       END;
  181.     END;
  182.     OvrSetBuf(LongInt(OvrGetBuf+OvrXtraBuf) DIV 512 * 512);
  183.     IF OvrResult<>OvrOK THEN
  184.     BEGIN
  185.       WriteLn('Overlay: OvrSetBuf error.');
  186.       Halt(252);
  187.     END;
  188.     OverlayLocation:=Disk;
  189.     IF OvrUseEMS THEN
  190.     BEGIN
  191.       OvrInitXMS;
  192.       IF OvrResult=OvrOk THEN
  193.       BEGIN
  194.         OverlayLocation:=XMS;
  195.       END ELSE
  196.       BEGIN
  197.         OvrInitEMS;
  198.         IF OvrResult=OvrOk THEN OverlayLocation:=EMS;
  199.       END;
  200.     END;
  201.     OvrSetRetry(OvrGetBuf DIV 3) ;
  202. {$IFDEF Alpha}
  203.     IF OverlayLocation=Disk THEN
  204.     BEGIN
  205.       OldReadBuf:=OvrReadBuf;
  206.       OvrReadBuf:=OwnOvrReadBuf;
  207.     END;
  208. {$ENDIF}
  209.   END;
  210.  
  211. BEGIN
  212. {$IFDEF Alpha}
  213.   StartMemAvail:=MemAvail;
  214. {$ENDIF}
  215.   InitOverlay;
  216. END.
  217.  
  218.